package exercicio;


public class Lexer {

	private String input;
	private int column;
	private char nextToken;

	public void reset(String input) {
		this.input = input;
		this.nextToken = readNext();
	}

	private char readNext() {
		char nextToken = '#';
		if (column < input.length()) {
			nextToken = input.charAt(column);
		}
		column++;
		return nextToken;
	}
	
	public char seeNext() {
		char nextToken = '#';
		if (column < input.length()) {
			nextToken = input.charAt(column);
		}
		return nextToken;
	}
	
	public TokenType seeToken() {
		TokenType tipo = null;

		if (nextToken == '#') {
			tipo = TokenType.EOF;
		} else {
			if (nextToken >= '0' && nextToken <= '9') {
				tipo = TokenType.NUMERO;
			} else if (nextToken == ';') {
				tipo = TokenType.PT_VIRG;
			} else if (nextToken == '+') {
				tipo = TokenType.ADD;
			} else if (nextToken == '*') {
				tipo = TokenType.MULT;
			} else if (nextToken == '(') {
				tipo = TokenType.ABRE_PAR;
			} else if (nextToken == ')') {
				tipo = TokenType.FECHA_PAR;
			} else {
				throw new RuntimeException("Erro de sintaxe");
			}
		}

		//String lexema = "" + this.nextToken;
		//this.nextToken = this.seeNext();

		return tipo;
	}

	public Token nextToken() {
		TokenType tipo = null;

		if (nextToken == '#') {
			tipo = TokenType.EOF;
		} else {
			if (nextToken >= '0' && nextToken <= '9') {
				tipo = TokenType.NUMERO;
			} else if (nextToken == ';') {
				tipo = TokenType.PT_VIRG;
			} else if (nextToken == '+') {
				tipo = TokenType.ADD;
			} else if (nextToken == '*') {
				tipo = TokenType.MULT;
			} else if (nextToken == '(') {
				tipo = TokenType.ABRE_PAR;
			} else if (nextToken == ')') {
				tipo = TokenType.FECHA_PAR;
			} else {
				throw new RuntimeException("Erro de sintaxe");
			}
		}

		String lexema = "" + this.nextToken;
		this.nextToken = this.readNext();

		return new Token(tipo, lexema);
	}

	public static void main(String[] args) {
		String programa = "(1+2)*3;";

		Lexer lexer = new Lexer();
		lexer.reset(programa);

		Token token = null;

		do {
			token = lexer.nextToken();
			System.out.println(token);
		} while (token.getToken() != TokenType.EOF);
	}
}
